package com.zh.juc.cas;

import java.util.concurrent.atomic.AtomicInteger;

/**
 * @Author: zhanghuan
 * @date: 2022/10/17 19:09
 * @description: create it
 * cas 比较并交换
 * 包含三个操作数--内存位值V，预期原值A 更新值B
 * 在执行cas操作的时候，将内存位置的值 与 预期值比较
 * 如果匹配 自动将该位置的值更新为新值
 * 如果不匹配 不做任何操作，多个线程同时执行CAS操作只会有一个成功
 *
 * 当A与V相同的时候，V改为B，否则重来
 * delta = 1
 *     public final int getAndAddInt(Object o, long offset, int delta) {
 *         int v;
 *         do {
 *             v = getIntVolatile(o, offset);
 *         } while (!compareAndSwapInt(o, offset, v, v + delta));
 *         return v;
 *     }
 *
 */
public class CASDemo {
    volatile int number = 0;
    AtomicInteger atomicInteger = new AtomicInteger(0);

    public int getNumber() {
        return number;
    }

    // 写入加锁保证原子性
    public synchronized void setNumber() {
        number++;
    }

    public int getAtomicInteger() {
        return atomicInteger.get();
    }

    public void setAtomicInteger() {
        atomicInteger.getAndIncrement();
    }

    public static void main(String[] args) {
        CASDemo casDemo = new CASDemo();
        casDemo.setAtomicInteger();
    }
}
